package com.fhx.core.utils

import androidx.collection.ArrayMap
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.greenrobot.eventbus.meta.SubscriberInfoIndex

object EventBusManager {
    /** EventBus 索引集合  */
    lateinit var indexList: ArrayList<SubscriberInfoIndex>

    /** 这个类是否需要注册 EventBus  */
    private val SUBSCRIBE_EVENT =
        ArrayMap<String, Boolean>()

    /**
     * 初始化 EventBus
     */
    fun init(list: ArrayList<SubscriberInfoIndex>?) {
        val builder = EventBus.builder() // 使用 Apt 插件
            .ignoreGeneratedIndex(false) // 添加索引类
        if (list != null && list.isNotEmpty()) {
            for (item in list) {
                builder.addIndex(item)
            }
            indexList = list
        }
        builder.installDefaultEventBus()
    }

    /**
     * 注册 EventBus
     */
    fun register(subscriber: Any) {
        if (canSubscribeEvent(subscriber) && !EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().register(subscriber)
        }
    }

    /**
     * 反注册 EventBus
     */
    fun unregister(subscriber: Any) {
        if (canSubscribeEvent(subscriber) && EventBus.getDefault()
                .isRegistered(subscriber)
        ) {
            EventBus.getDefault().unregister(subscriber)
        }
    }

    /**
     * 判断是否使用了 EventBus 注解
     *
     * @param subscriber                 被订阅的类
     */
    private fun canSubscribeEvent(subscriber: Any): Boolean {
        var clazz: Class<*>? = subscriber.javaClass
        // 这个 Class 类型有没有遍历过
        var result = SUBSCRIBE_EVENT[clazz!!.name]
        if (result != null) {
            // 有的话直接返回结果
            return result
        }

        // 没有的话进行遍历
        while (clazz != null) {
            // 如果索引集合中有这个 Class 类型的订阅信息，则这个类型的对象都需要注册 EventBus
            var exists = false
            for (item in indexList) {
                if (item.getSubscriberInfo(clazz) != null) {
                    exists = true
                    break
                }
            }

            if (exists) {
                // 这个类需要注册 EventBus
                result = true
                clazz = null
            } else {
                val clazzName = clazz.name
                // 跳过系统类（忽略 java. javax. android. androidx. 等开头包名的类）
                clazz = if (clazzName.startsWith("java") || clazzName.startsWith("android")) {
                    null
                } else {
                    // 往上查找
                    clazz.superclass
                }
            }
        }
        // 这个类不需要注册 EventBus
        if (result == null) {
            result = false
        }
        SUBSCRIBE_EVENT[subscriber.javaClass.name] = result
        return result
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onEventBus(helper: EventBusManager) {
        // 占位，只为了能生成 MyCoreEventBusIndex 索引类
        // 如果这个module中已经有用到 @Subscribe 去注解方法，这个方法可以直接删除
    }
}